import router from './router/index'
import { ElMessage } from "element-plus";
import { isHttp } from "@/utils/validate";//校验是不是外链
import { getToken } from './utils/token';
import usesettitlestore from '@/stores/settitle'
import useUserStore from '@/stores/user'
import usePermissionStore from "@/stores/permisssion"
import { isRelogin } from "@/utils/request"
// 进度条
import NProgress from "nprogress";
import "nprogress/nprogress.css";
NProgress.configure({
  easing: "ease",
  speed: 500,
  showSpinner: false,
  trickle: false,
});
const whiteList = ["/login"];
router.beforeEach((to, from, next) => {
  console.log(to, from, next);
  
  NProgress.start();// 进度条开始
  if (getToken()) {// 判断是否有token
   to.meta.title && usesettitlestore().setTitle(to.meta.title);//设置页面标题
    if (to.path == '/login') {//判断是否是登录页面
     next({ path: "/" });// 跳转到首页
       NProgress.done();// 进度条结束
    }else if(whiteList.indexOf(to.path) !== -1){// 判断是否在白名单内
      next()
    } else {
      if (useUserStore().roles.length === 0) {
        isRelogin.show = true;
        useUserStore().getInfo().then(() => {
          isRelogin.show = false;   
          usePermissionStore().generateRoutes().then((accessRoutes) => {//传递处理过的路由
        accessRoutes.forEach((route) => {
          if (!isHttp(route.path)) {
            router.addRoute(route);
          }
        });
                 const allRoutes = router.getRoutes();
                 console.log("所有已注册的路由:", allRoutes);
            //通过addRoute方法添加路由
            if (to.fullPath == "/") {
              var heardPath =
                accessRoutes[0].path.split("/")[1] == ""
                  ? ""
                  : accessRoutes[0].path;
              let pathIndex = "";
              pathIndex = heardPath + "/" + accessRoutes[0].children[0].path;
              //   console.log(accessRoutes[0].path);
              // console.log(pathIndex);
              // replace: true只是一个设置信息，告诉VUE本次操作后，不能通过浏览器后退按钮，返回前一个路由。

              
              next({ path: pathIndex, replace: true }); // hack方法 确保addRoutes已完成
            } else {
              // 如果是点击了一个菜单，然后刷新，保持在当前的页面。
              // 如果是从其他页面点击，通过打开新窗口跳转路由。如从当前故障报警详情里跳到实时监控页面。
              next({...to, replace: true }); // hack方法 确保addRoutes已完成
              // 使用next({ ...to, replace: true })来确保addRoutes()时动态添加的路由已经被完全加载上去。
            }
          });
        }).catch((err) => {
            useUserStore()
              .logOut()
              .then(() => {
                ElMessage.error(err);
                next({ path: "/login" });
              });
        })
      } else {
        next();
      }
    }
  } else {// 未登录
    if(whiteList.indexOf(to.path) !== -1){// 判断是否在白名单内
      next()
    }else{
      next(`/login?redirect=${to.fullPath}`);// 跳转到登录页面
      NProgress.done();// 进度条结束
    }
  }

});
router.afterEach(() => {// 后置路由
  NProgress.done();// 进度条结束
});
